// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIB_FDIO_WATCHER_H_
#define LIB_FDIO_WATCHER_H_

#include <lib/fdio/io.h>
#include <zircon/availability.h>
#include <zircon/compiler.h>

__BEGIN_CDECLS

typedef zx_status_t (*watchdir_func_t)(int dirfd, int event, const char* fn, void* cookie)
    ZX_AVAILABLE_SINCE(1);

// This event occurs when a file is added or removed, including (for `fdio_watch_directory()`) files
// that already exist.
#define WATCH_EVENT_ADD_FILE 1
#define WATCH_EVENT_REMOVE_FILE 2

// This event occurs, once, when `fdio_watch_directory()` runs out of existing files and has to
// start waiting for new files to be added.
#define WATCH_EVENT_WAITING 3

// Call the provided callback (cb) for each file in directory and each time a new file is added to
// the directory.
//
// If the callback returns a status other than `ZX_OK`, watching stops and the callback's status is
// returned to the caller of fdio_watch_directory.
//
// If the deadline expires, `ZX_ERR_TIMED_OUT` is returned to the caller.  A deadline of
// `ZX_TIME_INFINITE` will never expire.
//
// The callback may use `ZX_ERR_STOP` as a way to signal to the caller that it wants to stop because
// it found what it was looking for, etc -- since this error code is not returned by syscalls or
// public APIs, the callback does not need to worry about it turning up normally.
zx_status_t fdio_watch_directory(int dirfd, watchdir_func_t cb, zx_time_t deadline, void* cookie)
    ZX_AVAILABLE_SINCE(1);

__END_CDECLS

#endif  // LIB_FDIO_WATCHER_H_
